/*
 *  InterfaceUser.c
 *  Farfetch
 *
 *  Created by Rodrigo Souza on 4/8/10.
 *  Copyright 2010 Unicamp. All rights reserved.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include "InterfaceUser.h"
#include "TCPFarfetchClient.c"


/* Prints the menu with the options, to be chosen by the user. */
void printMenu() {

	
	printf("+----------------------------------------------------+\n");
	printf("|      Bem vindo ao           .-\"\"\"-.   _.---..-;    |\n");
	printf("| Farfetch Movie Theater     :.)     ;\"\"      \\/     |\n");
	printf("|   Digite o número da __..--'\\      ;-\"\"\"-.   ;._   |\n");
	printf("|     opção desejada:  `-.___.^.___.'-.____J__/-._J  |\n");
	printf("+----------------------------------------------------+\n");
	printf("|                                                    |\n");
	printf("|   1. Listar os números de todos os filmes          |\n");
	printf("|   2. Listar informações de todos os filmes         |\n");
	printf("|                                                    |\n");
	printf("|   3. Obter Informações sobre Sinopse               |\n");
	printf("|   4. Obter Informações gerais                      |\n");
	printf("|   5. Obter Média                                   |\n");
	printf("|                                                    |\n");
	printf("|   6. Dar uma nota                                  |\n");
	printf("|                                                    |\n");
	printf("|   7. Sair do sistema                               |\n");
	printf("+----------------------------------------------------+\n");
}

/* Read the input value(the number of the movie, or the rate) from the user. */
void readInputValue(int *value) {
	scanf("%d", value);
	
	//Ignores any character diferent from expected
	if(*value < 0){
		return readInputValue(value);
	}
}


/* Read the input option from the user. Return true if it was able to read, false otherwise. */
int readInputOption(int *option, int *value, int *rate) {
	scanf("%d", option);

	//Ignores any character diferent from expected
	if(*option > 9 || *option < 0){
		return readInputOption(option, value, rate);
	}	

	switch (*option) {
		case 1:
		case 2:
			printf("Ok, vou consultar o servidor. Aguarde um momento.\n");
			break;
		case 3:
		case 4:
		case 5:
			printf("Qual o número do filme?\n");
			readInputValue(value);
			break;
		case 6:
			
			/*
			 * Código de atribuição de notas. Não implementado!
			 *
			printf("Qual o número do filme?\n");
			readInputValue(value);
			printf("Que nota deseja atribuir, de 0 a 10?\n(somente números inteiros)\n");
			readInputValue(rate);
			*/
			
			printf("Desculpe, o sistema de atribuição de notas ainda não está funcionando.\n");
			return readInputOption(option, value, rate);
			
			break;
		case 7:
			printf("Obrigado por usar o Farfetch Movie Theater System 3.0!\n");
			exit(0);
		case 8:
			printf("Obrigado por usar o Farfetch Movie Theater System 3.0!\n");
			printf("Faaaaaaarfetch!! Fetch fetch, fetch faaaar!!\n");
			exit(0);	
		default:
			printf("Desculpe, não entendi nada. Qual a opção desejada?\n");
			return 0;
	}
	return 1;
}

void printAnswer (MoviesList *movies, int *option, int *count) {
	Movie *m;
	char *c;
	int i = 0;
	printf("\n");
	switch (*option) {
		case 1:
			printf("_-_ Lista de Filmes em Cartaz _-_\n");
			printf("\n");
			for (i = 0; i < *count; i++) {
				m = movies[i];
				printf("%d. %s\n", m->id, m->title);				
			}

			break;
		case 2:
			printf("_-_ Informações dos Filmes em Cartaz _-_\n");
			printf("\n");
			for (i = 0; i < *count; i++) {
				m = movies[i];
				printf("\n");
				printf("%d. %s\n", m->id, m->title);
				printf("%s\n", m->sinopse);
				printf("%s\n", m->room);
				printf("%s\n", m->hours);
				printf("Nota média dos internautas: %.1f\n\n", m->rate);
			}
			break;
			break;
		case 3:
			m = movies[0];
			printf("_-_ Sinopse do filme _-_\n");
			printf("\n");
			printf("%s\n", m->sinopse);
			break;
		case 4:
			m = movies[0];
			printf("_-_ %s _-_\n", m->title);
			printf("\n");
			printf("%s\n", m->sinopse);
			printf("\n");
			printf("%s\n", m->room);
			printf("%s\n", m->hours);
			printf("Nota média dos internautas: %.1f\n", m->rate);
			break;
		case 5:
			m = movies[0];
			printf("_-_ %s _-_\n", m->title);
			printf("\n");
			printf("Nota média dos internautas: %.1f\n", m->rate);
			printf("(%d internautas votaram)\n", m->clients);
			break;
		case 6:
			m = movies[0];
			printf("\nNota atribuída com sucesso!\n");
			printf("_-_ %s _-_\n", m->title);			
			printf("\nNova média dos internautas: %.1f\n", m->rate);
			printf("(%d internautas votaram)\n", m->clients);		
			break;
		default:
			break;
	}
	printf("\n\n");
	printf("\nPressione M para voltar ao menu...\n\n");
	scanf("%s", c);
}


int main(void)  {
	int option = -1;
	int value  = -1;
	int rate   = -1;
	int count  = -1;
	int couldReadInput = 0;
	time_t start,end;
	double dif;
	Request *r;
	MoviesList *answer;
	
	if ((r = (Request *) malloc(sizeof(r))) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}

	while(1){
		printMenu();
		while(!couldReadInput){
			couldReadInput = readInputOption(&option, &value, &rate);
		}
		
		r->option = option;
		r->value = value;
		r->rate = rate;
		
		printf("TEST: [%d] [%d] [%f]\n", r->option, r->value, r->rate);

		//time (&start);
		answer = executeRequest(r, &count);
		//time (&end);
		//dif = difftime (end,start);
		printAnswer(answer, &option, &count);

		//printf ("It took you %.2lf seconds to request and receive the answer.\n", dif );
		
		option = -1;
		value  = -1;
		rate   = -1;
		count  = -1;
		couldReadInput = 0;
		answer = NULL;
	}

	free(r);
	return 0;
}
